#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<vector>
using namespace std;
int dp[1001][1001];
int main() {
    string str;
    cin >> str;
    
    int n = str.size();
    for (int i = 0; i <= n; i++)
    {
        dp[i][i] = 1;
    }
    int ret = 1;
    for (int i = n ; i >= 0; i--)
    {
        for (int j = 1; j <= n; j++)
        {
            if (i > j)
                dp[i][j] = 0;
            else if(i == j)dp[i][j] = 1;
            else
            {
                if (str[i] == str[j])
                {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }
                else {
                    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
    }
    cout << dp[0][n-1];
}
//#include <iostream>
//#include<vector>
//using namespace std;
//#include <functional>
//#include <iostream>
//#include <queue>
//#include<unordered_map>
//#include<vector>
//#include<set>
//using namespace std;
//
//int main() {
//    unordered_map<int, bool> check;
//    int n, m;
//    cin >> n >> m;
//    vector<int> nums(m + n);
//    set<int> num;
//    for (int i = 0; i < m + n; i++)
//    {
//        int x;
//        cin >> x;
//        num.insert(x);
//    }
//    for (auto x : num)
//    {
//        cout << x << " ";
//    }
//    return 0;
//}
//int main() {
//    int n;
//    cin >> n;
//    int i = n / 2;
//    vector<int> nums(n);
//    int max = n;
//    int min = 1;
//    while (i < n)
//    {
//        nums[i++] = max--;
//        if (i < n)nums[i++] = min++;
//    }
//    i = n / 2 - 1;
//    while (i >= 0)
//    {
//        nums[i--] = min++;
//        if (i >= 0)nums[i--] = max--;
//    }
//    for (auto x : nums)
//    {
//        cout << x << " ";
//    }
//    return 0;
//}